package jpa.model;

import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.apache.log4j.Logger;

@Entity
public class Item {
	private static Logger logger = Logger.getLogger(Item.class);

	/* Atributos normais */
	private Long numeroDoPedido;
	private Long quantidade;

	@Id
	private Date dataDaCriacao;

	@ManyToOne
	@JoinColumn(name = "id_produto")
	@Id
	private Produto produto;

	@ManyToOne
	@JoinColumn(name = "id_cliente")
	@Id
	private Cliente cliente;

	/* Atributos de relacionamento */
	@ManyToOne
	@JoinColumn(name = "id_notafiscal")
	private NotaFiscal notaFiscal;

	@ManyToOne
	@JoinColumn(name = "id_departamento")
	private Departamento departamento;

	/* Construtor sem argumentos para o JPA */
	public Item() {
		/* Uma gambiarra oficial para descobrir quem chamou o construtor */
		try {
			throw new IllegalStateException();
		} catch (IllegalStateException e) {
			StackTraceElement[] stackTrace = e.getStackTrace();
			StackTraceElement stackTraceElement = stackTrace[1];
			if (stackTraceElement.getClassName().equals(
					"sun.reflect.NativeConstructorAccessorImpl")) {
				Item.logger.debug("JPA construindo um item");
			} else {
				Item.logger.info("Construindo um item");
			}
		}
	}

	/* RELACIONAMENTO COM NOTAFISCAL */
	public NotaFiscal getNotaFiscal() {
		return notaFiscal;
	}

	public void setNotaFiscal(NotaFiscal notaFiscal) {
		this.notaFiscal = notaFiscal;
	}

	/* RELACIONAMENTO COM DEPARTAMENTO */
	public Departamento getDepartamento() {
		return departamento;
	}

	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}

	/* RELACIONAMENTO COM PRODUTO */
	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	/* RELACIONAMENTO COM CLIENTE */
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	/* GETTERS E SETTERS */
	public Date getDataDaCriacao() {
		return dataDaCriacao;
	}

	public void setDataDaCriacao(Date dataDaCriacao) {
		this.dataDaCriacao = dataDaCriacao;
	}

	public Long getNumeroDoPedido() {
		return numeroDoPedido;
	}

	public void setNumeroDoPedido(Long numeroDoPedido) {
		this.numeroDoPedido = numeroDoPedido;
	}

	public Long getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(Long quantidade) {
		this.quantidade = quantidade;
	}

	/* Métodos reescritos */
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("\n--------------------" + this.getClass().getName()
				+ "--------------------\n");
		builder.append("Quantidade: " + this.quantidade + "\n");
		builder.append("Data de criação: " + this.dataDaCriacao + "\n");
		builder.append("Número do pedido: " + this.numeroDoPedido);
		builder.append("\n--------------------" + this.getClass().getName()
				+ "--------------------\n");
		return builder.toString();
	}
}
